跳到主要内容

Spring 热部署

如何实现热部署

使用一个 spring-boot-devtools 模块,可以实现 Spring Boot 热部署,这个模块最重要的功能就是自动将应用代码更改到最新的 App 上面去;spring-boot-devtools 可以实现页面热部署,实现类文件热部署(类文件修改后不会立即生效),实现对属性配置文件的热部署。其原理是 spring-boot-devtools 会监听 Classpath 下的文件变动,并且会立即重启应用(发生在保存时机)。

由于采用的虚拟机机制,重启的时候只是加载了在开发的 Class,没有重新加载第三方的 JAR 包,所以重启是很快的。

部署环境

Spring Boot DevTools 仅用于开发,而不用于生产。在生产环境是需要禁用的,所以得设置 optional=true(maven),这样一来,当我们在生产环境启动服务时(比如通过 java -jar 方式启动),spring-boot-devtools 会被禁用。同时Repackaged 生成的包默认情况下也是不包含 devtools 的,如有需要,可以通过设置 excludeDevtools 为 false 来启用它。

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>

然后还要添加一个插件进父类总工程的 pom.xml 里面,springboot 框架提供了一套自己的打包机制,是通过 spring-boot-maven-plugin 插件来实现的。(具体细节参考 Maven 的笔记)

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
</plugins>
</build>

编写配置文件

spring:
devtools:
restart:
# 添加那个目录的文件需要 restart
additional-paths: src/main/java
# 排除那个目录的文件不需要 restart
exclude: static/**,public/**

部署时有两种模式:fully packaged artifact 完全打包和 exploded artifact;采取前者打包方式 Spring 会认为是生产应用;后者认为是开发模式(一般默认打包是后者)

补充:Live Reload spring-boot-devtools 自带的 LiveReload 是一个用于前端的工具,它允许你在文件中进行更改时立即在浏览器中更新页面,如 HTML,CSS,图像 等。它甚至可以根据需要预处理文件(自动编译 SASS 或 LESS 文件) Spring DevTools 自动启动 LiveReload 服务器的本地实例,该服务器监视你的文件。你需要做的就是安装一个浏览器扩展,然后你就可以了。它不仅可用于开发应用程序的前端(如果将其作为 Spring 应用程序工件的一部分进行分发),还可用于监视和重新加载REST API的输出

注意:这个 Live Reload 只能开启一个,如果开启多个会抢占端口,而有时浏览器与 liveReload 的连接不会及时关闭,导致端口被占用,最终项目重启失败,这个 插件的地址

关于这个插件的使用说明参考 Spring Boot auto reload changes using LiveReload and DevTools

# 想要禁用的话
spring:
devtools:
livereload:
enabled: false

如何使用

idea 有自己的类加载机制(IDEA 默认是不自动编译的),而 spring-boot-devtools 又是监测 classpath 下的文件发生变化才会重启应用,所以需要设置 IDEA 的自动编译:

1、File--Settings--Compiler 勾选 Build Project automatically,也可以选上下面那个并行编译,以及最下面的那个依赖变更时也自动编译

2、ctrl + shift + alt + / 选择 Registry 勾上 compiler.automake.allow.when.app.running

  • compiler.automake.allow.when.app.running -> 自动重启
  • compile.document.save.trigger.delay -> 自动更新文件(主要是针对静态文件如JS CSS的更新)

开启 IDEA 的热部署策略

测试

  • 修改类–>保存:应用会重启
  • 修改配置文件–>保存:应用会重启

但是如果项目有很多个模块还是关掉上面的自动编译(只开 compiler.automake.allow.when.app.running),因为默认是对 全部模块 进行编译,所以手动编译单个模块就行了